package models

import (
	"activity_srv/basic/config"
	"gorm.io/gorm"
	"time"
)

// 拼团商品表
type GroupPGoods struct {
	Id           uint64         `gorm:"column:id;type:bigint UNSIGNED;comment:主键;primaryKey;not null;" json:"id"`                                           // 主键
	GoodsId      uint64         `gorm:"column:goods_id;type:bigint UNSIGNED;comment:商品id;not null;" json:"goods_id"`                                        // 商品id
	PingPrice    float64        `gorm:"column:ping_price;type:decimal(10, 2) UNSIGNED;comment:拼团商品价格;not null;" json:"ping_price"`                          // 拼团商品价格
	Stock        uint64         `gorm:"column:stock;type:bigint UNSIGNED;comment:库存;not null;" json:"stock"`                                                // 库存
	People       uint32         `gorm:"column:people;type:int UNSIGNED;comment:参团人数;not null;" json:"people"`                                               // 参团人数
	GoodsName    string         `gorm:"column:goods_name;type:varchar(255);comment:商品名称;not null;" json:"goods_name"`                                       // 商品名称
	GoodsImg     string         `gorm:"column:goods_img;type:varchar(255);comment:商品图片;not null;" json:"goods_img"`                                         // 商品图片
	YuanPrice    float64        `gorm:"column:yuan_price;type:decimal(10, 2) UNSIGNED;comment:商品原价;not null;" json:"yuan_price"`                            // 商品原价
	LimitPerson  uint32         `gorm:"column:limit_person;type:int UNSIGNED;comment:每人限购;not null;" json:"limit_person"`                                   // 每人限购
	StartTime    string         `gorm:"column:start_time;type:datetime(3);comment:拼团开始时间;not null;" json:"start_time"`                                      // 拼团开始时间
	EndTime      string         `gorm:"column:end_time;type:datetime(3);comment:拼团结束时间;not null;" json:"end_time"`                                          // 拼团结束时间
	PGoodsStatus uint8          `gorm:"column:p_goods_status;type:tinyint UNSIGNED;comment:拼团商品状态 0正常 1已结束 2已下架;not null;default:0;" json:"p_goods_status"` // 拼团商品状态 0正常 1已结束 2已下架
	MinLeaderLevel uint32      `gorm:"column:min_leader_level;type:int UNSIGNED;comment:团长最低等级要求，0表示无要求;not null;default:0;" json:"min_leader_level"`   // 团长最低等级要求
	MaxConcurrentGroups uint32 `gorm:"column:max_concurrent_groups;type:int UNSIGNED;comment:用户最多同时开团数;not null;default:5;" json:"max_concurrent_groups"`  // 用户最多同时开团数
	MinCreditScore float64     `gorm:"column:min_credit_score;type:decimal(10, 2) UNSIGNED;comment:团长最低信用分，0表示无要求;not null;default:0;" json:"min_credit_score"` // 团长最低信用分
	CreatedAt    time.Time      `gorm:"column:created_at;type:datetime(3);comment:创建时间;not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"`           // 创建时间
	UpdatedAt    time.Time      `gorm:"column:updated_at;type:datetime(3);comment:修改时间;not null;default:CURRENT_TIMESTAMP(3);" json:"updated_at"`           // 修改时间
	DeletedAt    gorm.DeletedAt `gorm:"column:deleted_at;type:datetime(3);comment:删除时间;default:NULL;" json:"deleted_at"`                                    // 删除时间
}

func (g *GroupPGoods) TableName() string {
	return "group_p_goods"
}

// 添加拼团商品
func (g *GroupPGoods) CreateGroupPGoods() error {
	return config.DB.Create(&g).Error
}

// 拼团商品列表
func (g *GroupPGoods) GroupPGoodsList(page int, pageSize int) (list []*GroupPGoods, err error) {
	err = config.DB.Where("p_goods_status = 0").Scopes(Paginate(page, pageSize)).Find(&list).Error
	return
}

// 分页
func Paginate(page int, pageSize int) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		if page <= 0 {
			page = 1
		}
		switch {
		case pageSize > 100:
			pageSize = 100
		case pageSize <= 0:
			pageSize = 10
		}

		offset := (page - 1) * pageSize
		return db.Offset(offset).Limit(pageSize)
	}
}

// 拼团商品修改
func (g *GroupPGoods) UpdateGroupPGoods() error {
	return config.DB.Where("id = ?", g.Id).Updates(&g).Error
}

// 修改拼团商品前验证主键ID是否存在
func (g *GroupPGoods) FindIdGroupPGoods() error {
	return config.DB.Where("id = ?", g.Id).First(&g).Error
}

// 拼团商品删除
func (g *GroupPGoods) DelGroupPGoods() error {
	return config.DB.Where("id = ?", g.Id).Delete(&g).Error
}

// 拼图商品修改状态
func (g *GroupPGoods) GetGoodsByStatus() error {
	return config.DB.Where("p_goods_status = ?", g.PGoodsStatus).Updates(&g).Error
}

// 扣减库存
func (g *GroupPGoods) UpdateStock() error {
	return config.DB.Where("id = ?", g.Id).Update("stock", g.Stock).Error
}
